package com.wx.dao.util;

import javax.annotation.PostConstruct;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;



import com.eachonline.util.RedisHelper;

import cn.jpush.api.utils.StringUtils;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 注意该类与父类RedisHelper的加载顺序，必须在RedisHelper后面初始化，否则覆盖无效
 * @author Jeffrey
 *
 */
public class RedisHelperInit extends RedisHelper {
	
	private static Logger logger= Logger.getLogger(RedisHelperInit.class);
	
	@Value("${app.name}")
	private String appName;
	
	@Value("${redis.host}")
    private String hostStr;
	
	@Value("${redis.port}")
	private String portStr;
	
	@Value("${redis.password}")
	private String authStr;
	
	@Value("${redis.maxIdle}")
	private String maxIdleStr;
	
	@Value("${redis.maxTotal}")
	private String maxTotalStr;
	
	@Value("${redis.maxWaitMillis}")
	private String maxWaitMillisStr;
	
	@Value("${redis.testOnBorrow}")
	private String testOnBorrowStr;

	@PostConstruct
    private void initialPool() {
		// 池基本配置
        JedisPoolConfig config = new JedisPoolConfig();
        
        //just for test
        System.out.println("App name :========================>>>>" + appName);
        
        //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
        config.setBlockWhenExhausted(true);
        // 设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
        config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
        //是否启用pool的jmx管理功能, 默认true
        config.setJmxEnabled(true);
        //最大空闲连接数, 默认8个 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例
        if(StringUtils.isNotEmpty(maxIdleStr)){
        	config.setMaxIdle(Integer.parseInt(maxIdleStr));
        }else{
        	config.setMaxIdle(10);
        }
        //最大连接数, 默认8个
        if(StringUtils.isNotEmpty(maxTotalStr)){
        	config.setMaxIdle(Integer.parseInt(maxTotalStr));
        }else{
        	config.setMaxTotal(100);
        }
        //表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException
        if(StringUtils.isNotEmpty(maxWaitMillisStr)){
        	config.setMaxWaitMillis(Integer.parseInt(maxWaitMillisStr));
        }else{
        	config.setMaxWaitMillis(1000 * 10);
        }
        //在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的
        if(StringUtils.isNotEmpty(testOnBorrowStr)){
        	config.setTestOnBorrow(Boolean.parseBoolean(testOnBorrowStr));
        }else{
        	config.setTestOnBorrow(false);
        }
        System.out.println("Redis host :========================>>>>" + hostStr);
        if(StringUtils.isEmpty(hostStr)){
        	logger.error("Redis host is not config.");
        }
        if(StringUtils.isEmpty(portStr)){
        	logger.error("Redis port is not config.");
        	portStr = "6379";
        }
        jedisPool = new JedisPool(config, hostStr, Integer.parseInt(portStr));
        
        //设置authPasswd
        if(StringUtils.isNotEmpty(authStr)){
        	authPasswd = authStr;
        }
	}
	
}
